package org.opens.lambda.date;

import cn.hutool.core.date.DateUtil;
import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateAndSimpleDateFormat {

    /**
     * 功能:
     *      说明传统Date的api的槽点.
     * 输出:
     *      2020-03-18
     * 说明:
     *      1. 槽点1: 第一个参数表示从格林治时间1900年开始加起, 也就是说, 如果你要生成一个2020年, 就需要计算一下2020-1900=120才可以;
     *      2. 槽点2: 第二个参数是从0开始计月份的; 但是第三个参数确实从1开始计日的.
     */
    @Test
    public void test1() {
        Date date = new Date(120, 2, 18);
        System.out.println(DateUtil.format(date, "yyyy-MM-dd"));
    }

    /**
     * 功能:
     *      验证SimpleDateFormat的槽点: 不是线程安全的.
     * 输出:
     *      Mon Feb 15 00:00:00 CST 2016
     *      Exception in thread "Thread-9" java.lang.NumberFormatException: For input string: ""
     *      	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
     *      	at java.lang.Long.parseLong(Long.java:601)
     *      	at java.lang.Long.parseLong(Long.java:631)
     *      	at java.text.DigitList.getLong(DigitList.java:195)
     *      	at java.text.DecimalFormat.parse(DecimalFormat.java:2084)
     *      	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1867)
     *      	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
     *      Mon Feb 15 00:00:00 CST 2016
     *      	at java.text.DateFormat.parse(DateFormat.java:364)
     *      	at org.opens.lambda.date.DateAndSimpleDateFormat.lambda$test2$0(DateAndSimpleDateFormat.java:36)
     *      	at java.lang.Thread.run(Thread.java:748)
     *      Mon Feb 15 00:00:00 CST 2016
     * 说明:
     *      1. 所以使用SimpleDateFormat需要加锁操作.
     */
    @Test
    public void test2() throws InterruptedException {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

        for(int i = 0; i < 30; i++) {
            new Thread(() -> {
                for(int j = 0; j < 100; j++) {
                    Date parse = null;
                    try {
                        parse = format.parse("20160215");
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    System.out.println(parse);
                }
            }).start();
        }

        Thread.currentThread().join();

    }

}
